package org.fatewa.engine.design.advice;

import org.fatewa.engine.advice.protocol.RayquazaResponse;
import org.fatewa.engine.property.RayquazaResponseProperties;
import org.springframework.boot.autoconfigure.jackson.JacksonProperties;

import java.lang.reflect.Method;

/**
 * 对协议进行处理的接口
 * 1.x 中的注解 + 策略模式用户侧扩展能力相对薄弱，
 * 以往在实际开发中如需进行扩展，基本上需要对 Kernel 进行源码级别的调整
 * 这显然是不够合理的，因此在本次重构时，也充分考虑了
 * 让用户扩展的途径，如果用户在Spring容器中注册了对应类型的的映射器
 * 则会使用用户自定义的映射器
 * 当范型为 Object 时，用户可以完全复写 Kernel 中的机制(但是不推荐)
 *
 * @author Edward Jobs
 */
public abstract class AbstractProtocolMapper<T> {
    /**
     * 对目标类型的实体进行消息结果映射
     *
     * @param body       目标类型
     * @param method     被调用的方法，用户可以从这里取到注解，并实现自定义注解策略
     * @param properties response Rayquaza的Response 配置
     * @param jackson    jackson 的相关配置，用于协调处理用户对jackson的个性化配置
     * @return 处理结果
     */
    public abstract RayquazaResponse map(T body, Method method, RayquazaResponseProperties properties, JacksonProperties jackson);
}
